package com.zzj.until;


import com.sun.xml.internal.ws.util.xml.XmlUtil;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


/**
 * 先创建Document对象，再创建XML
 * @author zzj
 *
 */
public class XMLUntil {
	/**
	 * 将xml转bean对象
	 * @param XmlStr
	 * @param t
	 * @return
	 */
	 public static <T> List<T> readXML(String XmlStr, T t) {   
	        List<T> list = new ArrayList<T>();//创建list集合   
	        try {   
	            SAXReader reader = new SAXReader();   
	            Document doc = DocumentHelper.parseText(XmlStr); 
	            Element root = doc.getRootElement();//获得根节点   
	            Element foo;//二级节点   
	            Field[] properties = t.getClass().getDeclaredFields();//获得实例的属性   
	            //实例的get方法   
	            Method getmeth;   
	            //实例的set方法   
	            Method setmeth;   
	               
	            for (Iterator i = root.elementIterator(t.getClass().getSimpleName()); i.hasNext();) {//遍历t.getClass().getSimpleName()节点   
	                foo = (Element) i.next();//下一个二级节点   
	               t=(T)t.getClass().newInstance();//获得对象的新的实例   
	               for (int j = 0; j < properties.length; j++) {//遍历所有孙子节点   
	                    //实例的set方法   
	                      setmeth = t.getClass().getMethod(   
	                            "set"  
	                                    + properties[j].getName().substring(0, 1)   
	                                            .toUpperCase()   
	                                    + properties[j].getName().substring(1),properties[j].getType());   
	                  //properties[j].getType()为set方法入口参数的参数类型(Class类型)   
	                    setmeth.invoke(t, foo.elementText(properties[j].getName()));//将对应节点的值存入   
	                    
	           
	                }   
	 
	                list.add(t);   
	            }   
	        } catch (Exception e) {   
	            e.printStackTrace();   
	        }   
	       
	        return list;   
	    }  
	
	/**
	 * 将对象转xml
	 * @param obj
	 * @param entityPropertys
	 * @return 
	 */
	 public static <T> String writeXmlDocument(Class obj, List<T> entityPropertys) { 
		 String beanxml="";
	        try {   
	            Document document = DocumentHelper.createDocument();   
	            String rootname = obj.getSimpleName();//获得类名   
	            Element root = document.addElement(rootname + "s");//添加根节点   
	            Field[] properties = obj.getDeclaredFields();//获得实体类的所有属性   
	            
	            for (T t : entityPropertys) {                                //递归实体   
	                Element secondRoot = root.addElement(rootname);            //二级节点   
	                
	                for (int i = 0; i < properties.length; i++) {                      
	                    //反射get方法       
	                    Method meth = t.getClass().getMethod(                      
	                            "get"  
	                                    + properties[i].getName().substring(0, 1)   
	                                            .toUpperCase()   
	                                    + properties[i].getName().substring(1));   
	                    //为二级节点添加属性，属性值为对应属性的值   
	                    secondRoot.addElement(properties[i].getName()).setText(   
	                            meth.invoke(t).toString());   
	  
	                }   
	            }   
	            //生成XML文件   
	            beanxml = document.asXML();
	        
	        } catch (Exception e) { 
	        	
	        	e.printStackTrace();
	            System.out.println("XML文件写入失败");   
	        }   
	        
	        return beanxml;
	    }
	
	/**
	 * 创建XML文件
	 * @param fileName  e.g c:/text.xml
	 * @param document 可以传null
	 * @return
	 */
	public static boolean creatXML(String fileName,Document document){
		try {
			// 紧凑的格式  
	        // OutputFormat format = OutputFormat.createCompactFormat();  
	        // 排版缩进的格式  
	        OutputFormat format = OutputFormat.createPrettyPrint();  
	        // 设置编码  
	        format.setEncoding("UTF-8");  
			XMLWriter writer=new XMLWriter(new OutputStreamWriter(  
	                new FileOutputStream(new File(fileName)), "UTF-8"),format);
			if(document != null){
				writer.write(document);
			}
		
			
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
	/**
	 * 建立Document对象
	 * @return
	 */
	public static Document creatDocument(){
		Document document=DocumentHelper.createDocument();//建立document对象，用来操作xml文件
		return document;
	}
	
	/**
	 * 读取指定位置下的XML,并获取根目录
	 * @param url   e.g c:/text.xml
	 * @return
	 */
	public static Element  readXML(String url){
		 // 创建saxReader对象  
        SAXReader reader = new SAXReader();  
        // 通过read方法读取一个文件 转换成Document对象  
        Document document=null;
		try {
			document = reader.read(new File(url));
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
        //获取根节点元素对象  
        Element node = document.getRootElement();  
        return node;
	}
	
	 /** 
     * 遍历当前节点元素下面的所有(元素的)子节点 
     *  
     * @param node 
     */  
    public static String getElementValue(Element node,String textname) {  
    	String values="";
        // 当前节点下面子节点迭代器  
        Iterator<Element> it = node.elementIterator();  
        // 遍历  
        while (it.hasNext()) { 
            // 获取某个子节点对象  
            Element e = it.next();
            if(e.getName().equals(textname)){
            	values=e.getText();
            	System.out.println(values);
            }else{
            	// 对子节点进行遍历  
                getElementValue(e,textname); 
            }
        }
        return values;
    }  
  
	
//	public static void main(String[] args) {
//		Document document = creatDocument();
//
//		Element booksElement=document.addElement("books");//建立根节点
//		booksElement.addComment("This is a test for dom4j ");//加入一行注释
//		Element bookElement=booksElement.addElement("book");//添加一个book节点
//		bookElement.addAttribute("show","yes");//添加属性内容
//		Element titleElement=bookElement.addElement("title");//添加文本节点
//		titleElement.setText("ajax in action");//添加文本内容
//		boolean flag = creatXML("src//test.xml", document);
//
//		//获取指定信息
//		Element node = readXML("src//test.xml");
//		//System.out.println(title.getText());
//		System.out.println(getElementValue(node,"title"));
//	}


}
